/*
 * DatosCambiarRumboOrden.cpp
 *
 *  Created on: 31/01/2010
 *      Author: San Martín, Matías I.
 */

#include "DatosCambiarRumboOrden.h"

#include "../../../Framework/Common/File.h"

namespace aplicacion {

std::ostream &operator<<( std::ostream &stream, const DatosCambiarRumboOrden &obj )
{
  return stream << "DatosCambiarRumboOrden("<< obj.getTamanio() <<"):"
			  << obj._idFlota << "|" << obj._idDestinoNuevo;
}

std::string DatosCambiarRumboOrden::toString() const
{
	std::stringstream stm;
	stm << *this;
	return stm.str();
}

DatosCambiarRumboOrden::DatosCambiarRumboOrden() {

	this->setTamanio(sizeof(t_identificadorFuente) +
								sizeof(T_ID_FLOTA));
}

DatosCambiarRumboOrden::~DatosCambiarRumboOrden() {
}


/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCambiarRumboOrden::save (int fd) const
{
	size_t guardar = 0;

	//se guardan los datos especificos de esta clase
	t_identificadorFuente destinoNuevo;

	_idDestinoNuevo.saveToMensaje(destinoNuevo);

	guardar += sizeof(_idFlota);
	File::writeAll(fd,&_idFlota,sizeof(_idFlota));

	guardar += sizeof(destinoNuevo);
	File::writeAll(fd,&destinoNuevo,sizeof(destinoNuevo));

	return guardar;
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCambiarRumboOrden::load (int fd)
{
	size_t cargar = 0;

	//se cargan los datos especificos de esta clase
	t_identificadorFuente destinoNuevo;

	cargar += sizeof(_idFlota);
	File::readAll(fd,&_idFlota,sizeof(_idFlota));

	cargar += sizeof(destinoNuevo);
	File::readAll(fd,&destinoNuevo,sizeof(destinoNuevo));

	_idDestinoNuevo.loadFromMensaje(destinoNuevo);

	this->setTamanio(cargar);
	return cargar;
}

/**
 * @see middleware::SerializableToArray#saveToArray(int)
 */
size_t DatosCambiarRumboOrden::saveToArray (uint8_t* arr) const {
	uint8_t* arr_inicial = arr;

	//se guardan los datos especificos de esta clase
	t_identificadorFuente destinoNuevo;
	_idDestinoNuevo.saveToMensaje(destinoNuevo);

	memcpy(arr, &_idFlota, sizeof(_idFlota));
	arr += sizeof(_idFlota);

	memcpy(arr, &destinoNuevo, sizeof(destinoNuevo));
	arr += sizeof(destinoNuevo);

	return arr-arr_inicial;
}

/**
 * @see middleware::SerializableToArray#loadFromArray(int)
 */
size_t DatosCambiarRumboOrden::loadFromArray (const uint8_t* arr) {
	const uint8_t* arr_inicial = arr;

	//se cargan los datos especificos de esta clase
	t_identificadorFuente destinoNuevo;

	memcpy(&_idFlota, arr, sizeof(_idFlota));
	arr += sizeof(_idFlota);

	memcpy(&destinoNuevo, arr, sizeof(destinoNuevo));
	arr += sizeof(destinoNuevo);

	_idDestinoNuevo.loadFromMensaje(destinoNuevo);

	size_t cargar = arr-arr_inicial;

	this->setTamanio(cargar);
	return cargar;
}

}//namespace aplicacion
